/*************************************************************************
    > File Name: 8.barrier.init.c
    > Author: Ykk
    > Mail: 3393579535@qq.com 
    > Created Time: 2023年05月13日 星期六 11时33分51秒
 ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define THREAD_NUM 5
#define MAX_COUNT 10

typedef struct {
    int id;               // 线程 ID
    pthread_barrier_t *barrier;  // 同步屏障
} thread_arg_t;

void* thread_func(void* arg) {

    thread_arg_t *thread_arg = (thread_arg_t*)arg;
    int i;

    for (i = 0; i < MAX_COUNT; i++) {
        printf("Thread %d: count = %d\n",thread_arg->id, i);
        // 等待所有线程都执行到这里
        pthread_barrier_wait(thread_arg->barrier);
    }

    return NULL;
}

int main(void) {
    int i;
    thread_arg_t thread_args[THREAD_NUM];
    pthread_t threads[THREAD_NUM];
    pthread_barrier_t barrier;

    // 初始化屏障（该屏障用于同步线程）
    pthread_barrier_init(&barrier, NULL, THREAD_NUM);

    // 创建多个线程
    for (i = 0; i < THREAD_NUM; i++) {
        thread_args[i].id = i;
        thread_args[i].barrier = &barrier;
        pthread_create(&threads[i], NULL, thread_func, &thread_args[i]);
    }

    // 等待所有线程结束
    for (i = 0; i < THREAD_NUM; i++) {
        pthread_join(threads[i], NULL);
    }

    // 销毁屏障
    pthread_barrier_destroy(&barrier);

    return 0;
}

